-use self::repo_checkout_filter::filter_trampoline;
use glib::translate::{Stash, ToGlib, ToGlibPtr};
use glib_sys::gpointer;
use libc::c_char;
-use ostree_sys::{OstreeRepo, OstreeRepoCheckoutAtOptions, OstreeRepoCheckoutFilterResult};
+use ostree_sys::OstreeRepoCheckoutAtOptions;
use std::path::{Path, PathBuf};
use {Repo, RepoCheckoutFilterResult};
use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
pub force_copy_zerosized: bool,
pub subpath: Option<PathBuf>,
pub devino_to_csum_cache: Option<RepoDevInoCache>,
- pub filter: RepoCheckoutFilter,
+ pub filter: Option<RepoCheckoutFilter>,
pub sepolicy: Option<SePolicy>,
pub sepolicy_prefix: Option<String>,
}
options.sepolicy = sepolicy.0;
if let Some(filter) = &self.filter {
- options.filter_user_data = filter
- as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>
- as gpointer;
- options.filter = Some(
- filter_trampoline
- as unsafe extern "C" fn(
- *mut OstreeRepo,
- *const c_char,
- *mut libc::stat,
- gpointer,
- ) -> OstreeRepoCheckoutFilterResult,
- );
+ options.filter_user_data = filter as *const RepoCheckoutFilter as gpointer;
+ options.filter = repo_checkout_filter::trampoline();
}
Stash(options.as_ref(), (options, subpath, sepolicy_prefix))
);
assert_eq!((*ptr).unused_ints, [0; 6]);
assert_eq!((*ptr).unused_ptrs, [ptr::null_mut(); 3]);
- assert_eq!(
- (*ptr).filter,
- Some(
- filter_trampoline
- as unsafe extern "C" fn(
- *mut OstreeRepo,
- *const c_char,
- *mut libc::stat,
- gpointer,
- )
- -> OstreeRepoCheckoutFilterResult
- )
- );
+ assert_eq!((*ptr).filter, repo_checkout_filter::trampoline());
assert_eq!(
(*ptr).filter_user_data,
- options.filter.as_ref().unwrap()
- as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>
- as gpointer
+ options.filter.as_ref().unwrap() as *const RepoCheckoutFilter as gpointer
);
assert_eq!((*ptr).sepolicy, options.sepolicy.to_glib_none().0);
assert_eq!(
use ostree_sys::{OstreeRepo, OstreeRepoCheckoutFilterResult};
use std::path::{Path, PathBuf};
-pub type RepoCheckoutFilter =
- Option<Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>>;
+pub type RepoCheckoutFilter = Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
-pub(super) unsafe extern "C" fn filter_trampoline(
+unsafe extern "C" fn filter_trampoline(
repo: *mut OstreeRepo,
path: *const c_char,
stat: *mut libc::stat,
user_data: gpointer,
) -> OstreeRepoCheckoutFilterResult {
// TODO: handle unwinding
- let closure =
- user_data as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
+ let closure = user_data as *const RepoCheckoutFilter;
let repo = FromGlibPtrNone::from_glib_none(repo);
let path: PathBuf = FromGlibPtrNone::from_glib_none(path);
let result = (*closure)(&repo, &path, &*stat);
result.to_glib()
}
+
+pub(super) fn trampoline() -> Option<
+ unsafe extern "C" fn(
+ *mut OstreeRepo,
+ *const c_char,
+ *mut libc::stat,
+ gpointer,
+ ) -> OstreeRepoCheckoutFilterResult,
+> {
+ Some(filter_trampoline)
+}